package PossiveisJogadas;

import java.util.LinkedList;
import java.util.List;

import util.Constantes;
import Jplay.TileInfo;
import MotorGrafico.Indice;
import MotorGrafico.Tabuleiro;
import MotorRegras.Regras;

/**
 * Classe Respons�vel pela chamada dos m�todos que controlam as casas de
 * poss�veis jogadas para cada pe�a.
 * 
 * @author Gefersom C. Lima
 * 
 */
public class PossiveisJogadas {

	/**
	 * Verifica as possiveis jogadas de uma pe�a e retorna uma lista com as
	 * jogadas.
	 * 
	 * @param t
	 *            Tabuleiro
	 * @param origem
	 *            Posi��o da pe�a que se quer verificar as poss�veis jogadas.
	 * 
	 * @return List<Indice>, retorna uma lista com as poss�veis jogadas, caso
	 *         n�o haja jogadas, retorna null.
	 */
	public static List<Indice> possiveisJogadas(Tabuleiro tabuleiro,
			Indice origemPeca) {
		int tipoPeca = tabuleiro.getPeca(origemPeca.i, origemPeca.j);

		if (tipoPeca == Constantes.WHITE_BISPO
				|| tipoPeca == Constantes.BLACK_BISPO) {
			return JogadasBispo.possiveisJogadas(origemPeca, tabuleiro);
		} else if (tipoPeca == Constantes.WHITE_CAVALO
				|| tipoPeca == Constantes.BLACK_CAVALO) {
			return JogadasCavalo.possiveisJogadas(origemPeca, tabuleiro);
		} else if (tipoPeca == Constantes.BLACK_PEAO
				|| tipoPeca == Constantes.WHITE_PEAO) {
			return JogadasPeao.possiveisJogadas(origemPeca, tabuleiro);
		} else if (tipoPeca == Constantes.BLACK_RAINHA
				|| tipoPeca == Constantes.WHITE_RAINHA) {
			return JogadasRainha.possiveisJogadas(origemPeca, tabuleiro);
		} else if (tipoPeca == Constantes.BLACK_REI
				|| tipoPeca == Constantes.WHITE_REI) {
			return JogadasRei.possiveisJogadas(origemPeca, tabuleiro);
		} else if (tipoPeca == Constantes.BLACK_TORRE
				|| tipoPeca == Constantes.WHITE_TORRE) {
			return JogadasTorre.possiveisJogadas(origemPeca, tabuleiro);
		}

		return null;
	}
	
    public static List<Indice> possiveisJogadasEnPassant(Tabuleiro tabuleiro, Indice origemPeca, List enPassant) 
    {
        int tipoPeca = tabuleiro.getPeca(origemPeca.i, origemPeca.j);

        if ((tipoPeca == Constantes.BLACK_PEAO || tipoPeca == Constantes.WHITE_PEAO) 
                  && Regras.enPassant(origemPeca, tabuleiro, enPassant))
        {
            LinkedList lista = new LinkedList();		
            int sinal = tipoPeca == Constantes.WHITE_PEAO? 1: -1;
            
            if (tipoPeca == Constantes.WHITE_PEAO && origemPeca.i - 1 > 0) 
            {                
                if (tabuleiro.getPeca(origemPeca.i, origemPeca.j + 1) != Constantes.ESTADO_VAZIO)            
                    lista.add(new Indice(origemPeca.i -1, origemPeca.j + 1));
                if (tabuleiro.getPeca(origemPeca.i, origemPeca.j + -1) != Constantes.ESTADO_VAZIO)
                    lista.add(new Indice(origemPeca.i -1, origemPeca.j - 1));
            }
            else{
                    if (tipoPeca == Constantes.BLACK_PEAO && origemPeca.i + 1 < Constantes.QUANT_LINHAS_TABULEIRO)
                    {
                        if (tabuleiro.getPeca(origemPeca.i, origemPeca.j + 1) != Constantes.ESTADO_VAZIO)            
                            lista.add(new Indice(origemPeca.i +1, origemPeca.j + 1));
                        if (tabuleiro.getPeca(origemPeca.i, origemPeca.j + -1) != Constantes.ESTADO_VAZIO)
                            lista.add(new Indice(origemPeca.i +1, origemPeca.j - 1));                                
                    }
            }
            return lista;

        }

        return null;

    }	

}
